import { Injectable } from "@nestjs/common";
import { Repository } from "typeorm";

/**
 * 手动时间戳服务
 * 为MySQL 5.5提供兼容的时间戳管理
 */
@Injectable()
export class ManualTimestampService {
  /**
   * 为实体设置创建时间
   * @param entity 实体对象
   */
  setCreatedAt(entity: any): void {
    if (entity.created_at === null || entity.created_at === undefined) {
      entity.created_at = new Date();
    }
  }

  /**
   * 为实体设置更新时间
   * @param entity 实体对象
   */
  setUpdatedAt(entity: any): void {
    entity.updated_at = new Date();
  }

  /**
   * 为实体设置创建和更新时间
   * @param entity 实体对象
   * @param isUpdate 是否为更新操作
   */
  setTimestamps(entity: any, isUpdate: boolean = false): void {
    if (!isUpdate) {
      this.setCreatedAt(entity);
    }
    this.setUpdatedAt(entity);
  }

  /**
   * 批量设置时间戳
   * @param entities 实体数组
   * @param isUpdate 是否为更新操作
   */
  setTimestampsBatch(entities: any[], isUpdate: boolean = false): void {
    entities.forEach((entity) => {
      this.setTimestamps(entity, isUpdate);
    });
  }

  /**
   * 在保存前设置时间戳
   * @param repository TypeORM仓库
   * @param entity 实体对象
   * @param isUpdate 是否为更新操作
   */
  async saveWithTimestamps<T extends Object>(
    repository: Repository<T>,
    entity: any,
    isUpdate: boolean = false
  ): Promise<T> {
    this.setTimestamps(entity, isUpdate);
    return await repository.save(entity);
  }

  /**
   * 在批量保存前设置时间戳
   * @param repository TypeORM仓库
   * @param entities 实体数组
   * @param isUpdate 是否为更新操作
   */
  async saveBatchWithTimestamps<T extends Object>(
    repository: Repository<T>,
    entities: any[],
    isUpdate: boolean = false
  ): Promise<T[]> {
    this.setTimestampsBatch(entities, isUpdate);
    return await repository.save(entities);
  }

  /**
   * 获取当前时间
   * @returns 当前时间
   */
  getCurrentTime(): Date {
    return new Date();
  }

  /**
   * 格式化时间为MySQL 5.5兼容的字符串
   * @param date 日期对象
   * @returns 格式化的时间字符串
   */
  formatForMySQL(date: Date): string {
    return date.toISOString().slice(0, 19).replace("T", " ");
  }
}
